%% 函数或者脚本说明
%{
---------------------------------------------------
*文件名: YW_Plot Version 11.17
*函数名: hf=YW_Plot(x,x,x,x)
*功   能:多条曲线绘图函数，可以开启第二个y轴，甚至可以使用第二套legend（不推荐）
*变量说明:
**varargin**:
----必须输入两个或四个元胞，否则报错

*注意事项:
		% 查看plot_example了解调用方法
        % 所有matlab的图，一律复制为矢量图，另外保存好原fig文件。
        % 图采用4:3长宽比例（eg. 560比420）；图中曲线颜色为蓝色，
        % 线宽为2号加粗；数据拟合曲线采用不连续红色线加粗；数据
        % 点用*圆圈marker*表示；横纵坐标和横纵坐标轴为14号Helvetica
        % 字体加粗，tick可以自己定义。
---------------------------------------------------
%}

% ===================main===========================
function [Hf_this] = YW_Plot(varargin)

    %% 先判断输入参数的个数
    if nargin == 2
        general = varargin{1}; data = varargin{2};
        other = cell(5, 5); %随便一个空cell
        another_axis = cell(5, 5); %随便一个空cell
    elseif nargin == 4
        general = varargin{1}; data = varargin{2};
        other = varargin{3};
        another_axis = varargin{4};
    else
        disp('输入变量数目出错，请输入两个或四个参数！');
        disp('From YW_Plot');
        return;
    end

    %% 此处定义一些默认的值
    MarkerSize = 6;
    Interpreter = 'latex'; % 如果不使用中文的话,改成latex效果更好
    FontSize = 14;
    nargin;
    xaxis1_color = 'k'; [0 0 0];
    yaxis1_color = 'k'; [0.00, 0.45, 0.74];
    yaxis2_color =  [1.00, 0.07, 0.65];%'R';
    Linewidth_box = 1.5; % 坐标轴，图例的线框宽度
    Line_Width = 2; %线条的宽度
    fig_size = [500 300 560 420]; %figure大小

    %% 设置图形窗口参数
    Hf_this = figure;
    set(Hf_this, 'Name', general{1, 2}); % 窗口名字
    Hf_this.NumberTitle = 'off'; % 是否显示名字前面的Figure 1
    set(Hf_this, 'Color', 'white') % 背景颜色,也可用RGB,如[110]
    set(Hf_this, 'Renderer', 'painters') % 渲染器
    set(Hf_this, 'Position', fig_size) % 含义分别为左和下边缘到窗口，宽，高，4:3
    set(Hf_this, 'Units', 'points') % 单位，默认是pixels,归一化为'normalized'
    title(general{2, 2}); %标题名字

    % ///////////////////////////////////////
    % 【第一个y轴】
    %

    %% 绘图区
    H_axes_one = gca; % get the axes object

    % if other{2, 2} % 如果第二个y轴的数据存在，需要先激活右轴，设置颜色
    %     % 已经不知道这几句代码的意义了
    %     yyaxis right;
    %     set(H_axes_one, 'YColor', 'none');
    %     yyaxis left;
    % end

    %     H_axes_one.YAxisLocation = 'left';

    [H1, legend_str] = plot_and_legend(data, size(data, 1)); % 指定行数

    function [H_plot, H_legend] = plot_and_legend(Data, rows)

        for line_order = 2:rows % 对每一组线
            X = Data{line_order, 1};
            Y = Data{line_order, 2};
            Legend_name = Data{line_order, 3};
            Color = Data{line_order, 4};
            LineStyle = Data{line_order, 5};
            % 每条线生成一个句柄，用来与有两个图层时的图例对应
            H1(line_order - 1) = plot(X, Y, LineStyle, 'color', Color, 'LineWidth', Line_Width, 'MarkerSize', ...
            MarkerSize, 'MarkerEdgeColor', Color); %'MarkerFaceColor',[.49 1 .63]
            legend_str{line_order - 1} = [Legend_name];
            hold on;
            box off;
        end

        H_plot = H1; H_legend = legend_str;
    end

    %% 标签，图注，坐标轴更改
    Hlgd = legend;
    set(Hlgd, 'String', legend_str);
    set(Hlgd, 'FontName', 'Arial');
    set(Hlgd, 'FontSize', FontSize - 2); %FontSize-2
    set(Hlgd, 'FontSize', FontSize); %FontSize-2
    set(Hlgd, 'LineWidth', Linewidth_box)
    set(Hlgd, 'TextColor', [0.00, 0.45, 0.74]); %yaxis1_color )
    set(Hlgd, 'Location', 'best') % best,详细阅读手册
    % set(Hlgd, 'Interpreter',Interpreter);
    set(Hlgd, 'Box', 'off') %是否 删除图例轮廓
    set(Hlgd, 'color', 'none');
    set(Hlgd, 'FontWeight', 'bold');
    hold on;

    set(H_axes_one, 'lineWidth', 1.5, ...
        'XColor', xaxis1_color, ...
        'YColor', yaxis1_color, 'FontSize', FontSize, 'FontWeight', 'bold');
    set(H_axes_one, 'color', 'none');
    set(H_axes_one, 'XMinorTick', 'on'); %打开小刻度
    x_label = general{3, 2};
    y_label = general{4, 2};
    xlabel(x_label, 'FontSize', FontSize, 'FontWeight', 'bold');
    ylabel(y_label, 'FontSize', FontSize, 'FontWeight', 'bold');
    H_axes_one.TickDir = 'out'; % 刻度方向 out in both
    % xticks('auto'); %或者用一个向量
    % xticks([.75 1.9]); %或者用一个向量
    % xticklabels([2 3 4]); % 要显示那些数字的标签

    % box off;

    % ///////////////////////////////////////
    % 【第二个y轴】
    %

    %% 设置第二个y轴
    % %------------------------------------------------------
    if other{2, 2}
        yyaxis right
        [H2, legend_str2] = plot_and_legend(another_axis, size(another_axis, 1));

        y_label2 = other{1, 2};
        ylabel(H_axes_one, y_label2, 'FontSize', FontSize, 'FontWeight', 'bold') %,'visible', 'off');
        set(H_axes_one, 'ycolor', yaxis2_color) % 设置标签颜色
        %    yyaxis left % 再设置一下左轴，因为前面使用的是H_axes_one.YAxisLocation = 'left'，经过后面的yyaxis，颜色发生改变
        %    set(H_axes_one,'lineWidth',15,'YColor',yaxis1_color,'FontSize', FontSize,'FontWeight','bold');
        %    yyaxis right

        %% 【第二个图层】设置第二个轴系，用来分别显示图例
        if other{3, 2} %是否分开显示图例
            legend(H_axes_one, H1, legend_str)
            second_axis = axes('position', get(H_axes_one, 'position'), 'visible', 'off', ...
                'Color', 'none');
            Hlgd2 = legend(second_axis);
            legend(second_axis, H2, legend_str2) % 标签名词
            set(Hlgd2, 'FontSize', FontSize - 2)
            set(Hlgd2, 'LineWidth', Linewidth_box)
            set(Hlgd2, 'TextColor', yaxis2_color)
            set(Hlgd2, 'Location', 'northeast') % best,详细阅读手册
            set(Hlgd2, 'Interpreter', 'tex'); %Interpreter)
            set(Hlgd2, 'Box', 'on') %是否 删除图例轮廓
            set(Hlgd2, 'color', 'none');
            linkaxes([H_axes_one, second_axis], 'x');

            % %------------------------------------------------------
        end

    end

    %% 其它设置
    box on; %是否显示边框
    % box off
    % grid on;
    % grid minor;

    disp("Congratulations! Plot Done!");
end

%% colors
% https://blog.csdn.net/wang1qqqq/article/details/94459631
